<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="gnfSM" id="gnfSM"><span data-lake-id="uabaffebf" id="uabaffebf">典型回答</span></h1>
  <h2 data-lake-id="K2mjS" id="K2mjS"><span data-lake-id="ubda476e0" id="ubda476e0">相同点</span></h2>
  <p data-lake-id="u45b68c1e" id="u45b68c1e"><span data-lake-id="ua25b5545" id="ua25b5545">对于下面的代码来说，如果是Spring容器的话，两个注解的功能基本是等价的，他们都可以将bean注入到对应的field中</span></p>
  <pre lang="java"><code>
@Autowired
private Bean beanA;
@Resource
private Bean beanB;
</code></pre>
  <p data-lake-id="u809c11f2" id="u809c11f2"><br></p>
  <h2 data-lake-id="zIewx" id="zIewx"><span data-lake-id="ue59b2268" id="ue59b2268">不同点</span></h2>
  <h3 data-lake-id="AtHFL" id="AtHFL"><span data-lake-id="u96eafa70" id="u96eafa70">byName和byType匹配顺序不同</span></h3>
  <ol list="u4315e2ac">
   <li fid="u836d20ad" data-lake-id="uaa5406b5" id="uaa5406b5"><span data-lake-id="u48d61b3c" id="u48d61b3c">Autowired在获取bean的时候，先是byType的方式，再是byName的方式。意思就是先在Spring容器中找以Bean为类型的Bean实例，如果找不到或者找到多个bean，则会通过fieldName来找。举个例子：</span></li>
  </ol>
  <pre lang="java"><code>
@Component("beanOne")
class BeanOne implements Bean {}
@Component("beanTwo")
class BeanTwo implements Bean {}
@Service
class Test {
    // 此时会报错，先byType找到两个bean：beanOne和beanTwo
    // 然后通过byName（bean）仍然没办法匹配
	@Autowired
    private Bean bean; 

    // 先byType找到两个bean，然后通过byName确认最后要注入的bean
    @Autowired
    private Bean beanOne;

    // 先byType找到两个bean，然后通过byName确认最后要注入的bean
    @Autowired
    @Qualifier("beanOne")
    private Bean bean;
}
</code></pre>
  <ol list="ubed8fbdb" start="2">
   <li fid="ua0e8f02f" data-lake-id="ud90847b5" id="ud90847b5"><span data-lake-id="uddc1ce05" id="uddc1ce05">Resource在获取bean的时候，和Autowired恰好相反，先是byName方式，然后再是byType方式。当然，我们也可以通过注解中的参数显示指定通过哪种方式。同样举个例子：</span></li>
  </ol>
  <pre lang="java"><code>
@Component("beanOne")
class BeanOne implements Bean {}
@Component("beanTwo")
class BeanTwo implements Bean {}
@Service
class Test {
    // 此时会报错，先byName，发现没有找到bean
    // 然后通过byType找到了两个Bean：beanOne和beanTwo，仍然没办法匹配
	@Resource
    private Bean bean; 

    // 先byName直接找到了beanOne，然后注入
    @Resource
    private Bean beanOne;

    // 显示通过byType注入，能注入成功
    @Resource(type = BeanOne.class)
    private Bean beanOne;
}
</code></pre>
  <h3 data-lake-id="QG9ew" id="QG9ew"><span data-lake-id="ub586b303" id="ub586b303">作用域不同</span></h3>
  <ol list="u3f60d59b">
   <li fid="u55599bf0" data-lake-id="u4626f6b7" id="u4626f6b7"><span data-lake-id="u33b58cc5" id="u33b58cc5">Autowired可以作用在构造器，字段，setter方法上</span></li>
   <li fid="u55599bf0" data-lake-id="uc2bea44e" id="uc2bea44e"><span data-lake-id="u6bc9c9ff" id="u6bc9c9ff">Resource 只可以使用在field，setter方法上</span></li>
  </ol>
  <h3 data-lake-id="vjDeJ" id="vjDeJ"><span data-lake-id="u288faffa" id="u288faffa">支持方不同</span></h3>
  <ol list="uca6722c0">
   <li fid="u8547d47d" data-lake-id="uafb1d642" id="uafb1d642"><span data-lake-id="u0c0b988c" id="u0c0b988c">Autowired是Spring提供的自动注入注解，只有Spring容器会支持，如果做容器迁移，是需要修改代码的</span></li>
   <li fid="u8547d47d" data-lake-id="ua8ad6f27" id="ua8ad6f27"><span data-lake-id="u32a6e8c3" id="u32a6e8c3">Resource是JDK官方提供的自动注入注解（JSR-250）。它等于说是一个标准或者约定，所有的IOC容器都会支持这个注解。假如系统容器从Spring迁移到其他IOC容器中，是不需要修改代码的。</span></li>
  </ol>
 </body>
</html>